/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.sgc.manager;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.RolDto;
import com.brain.core.dto.UsuarioDto;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.manager.ComunManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.manager.RolManager;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.mbean.UsuarioMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.sgc.dto.PersonaDto;
import com.brain.sgc.view.util.ConstantesSgc;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Christian
 */
@Service
public class PersonaManager extends ComunManager<PersonaDto> implements Serializable {

    @Resource
    private DAOGenerico<PersonaDto> springHibernateDao;
    private static Logger logger = Logger.getLogger(OrganizacionManager.class);
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private RolManager rolManager;

    public List<PersonaDto> obtenerPersonasHistorial(PersonaDto dtoFiltro) throws DAOException {
        List<PersonaDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            mapFiltro.put("id", dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            mapFiltro.put("nombreCompleto", dtoFiltro.getNombreCompleto());
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("tipoDocumento.id", dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            mapFiltro.put("numeroDocumento", dtoFiltro.getNumeroDocumento());
        }
        if (dtoFiltro.getSexoDto().getId() != null && !dtoFiltro.getSexoDto().getId().equals(0L) && !dtoFiltro.getSexoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("tipoDocumento.id", dtoFiltro.getTipoDocumentoDto().getId());
        }

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("apellidoPaterno", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }
    
    public List<PersonaDto> obtenerPersonaPorUsuarioSistema(Long idUsuario) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";
        hqsql += " and e.usuarioSistemaDto.id = ?";
        listaParametros.add(idUsuario);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PersonaDto> obtenerPersonaCalificada() throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";
        hqsql += " and e.gt = ?";
        listaParametros.add(ConstantesSgc.Parametro.GESTION_TALENTO);
        hqsql += " order by e.promedioFinal desc";
        //System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PersonaDto> obtenerEmpleadosCapa() throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";
        hqsql += " and e.emp = ?";
        listaParametros.add(Boolean.TRUE);
        hqsql += " order by e.apellidoPaterno asc";
        //System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PersonaDto> obtenerEmpleados(PersonaDto dtoFiltro) throws DAOException {
        List<PersonaDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            mapFiltro.put("id", dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            mapFiltro.put("nombreCompleto", dtoFiltro.getNombreCompleto());
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("tipoDocumentoDto.id", dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            mapFiltro.put("numeroDocumento", dtoFiltro.getNumeroDocumento());
        }
        if (dtoFiltro.getSexoDto().getId() != null && !dtoFiltro.getSexoDto().getId().equals(0L) && !dtoFiltro.getSexoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("sexoDto.id", dtoFiltro.getSexoDto().getId());
        }

        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("sedeDto.id", dtoFiltro.getSedeDto().getId());
        }

        if (dtoFiltro.getPuestoDto() != null && !dtoFiltro.getPuestoDto().getId().equals(0L)) {
            mapFiltro.put("puestoDto.id", dtoFiltro.getPuestoDto().getId());
        }

        mapFiltro.put("emp", Boolean.TRUE);

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("apellidoPaterno", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }

    public List<PersonaDto> obtenerPersonasParaConvocatoria(PersonaDto dtoFiltro) throws DAOException {
        List<PersonaDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            mapFiltro.put("id", dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            mapFiltro.put("nombreCompleto", dtoFiltro.getNombreCompleto());
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("tipoDocumentoDto.id", dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            mapFiltro.put("numeroDocumento", dtoFiltro.getNumeroDocumento());
        }
        if (dtoFiltro.getSexoDto().getId() != null && !dtoFiltro.getSexoDto().getId().equals(0L) && !dtoFiltro.getSexoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("sexoDto.id", dtoFiltro.getSexoDto().getId());
        }

        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("sedeDto.id", dtoFiltro.getSedeDto().getId());
        }

        if (dtoFiltro.getPuestoDto() != null && !dtoFiltro.getPuestoDto().getId().equals(0L)) {
            mapFiltro.put("puestoDto.id", dtoFiltro.getPuestoDto().getId());
        }

        mapFiltro.put("emp", Boolean.FALSE);

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("apellidoPaterno", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }

    public List<PersonaDto> obtenerPersonasParaEncuesta(PersonaDto dtoFiltro) throws DAOException {
        List<PersonaDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            mapFiltro.put("id", dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            mapFiltro.put("nombreCompleto", dtoFiltro.getNombreCompleto());
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("tipoDocumentoDto.id", dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            mapFiltro.put("numeroDocumento", dtoFiltro.getNumeroDocumento());
        }
        if (dtoFiltro.getSexoDto().getId() != null && !dtoFiltro.getSexoDto().getId().equals(0L) && !dtoFiltro.getSexoDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("sexoDto.id", dtoFiltro.getSexoDto().getId());
        }

        if (dtoFiltro.getSedeDto().getId() != null && !dtoFiltro.getSedeDto().getId().equals(0L) && !dtoFiltro.getSedeDto().getId().equals(ConstantesCore.Parametro.TODOS)) {
            mapFiltro.put("sedeDto.id", dtoFiltro.getSedeDto().getId());
        }

        if (dtoFiltro.getPuestoDto() != null && !dtoFiltro.getPuestoDto().getId().equals(0L)) {
            mapFiltro.put("puestoDto.id", dtoFiltro.getPuestoDto().getId());
        }

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("apellidoPaterno", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }

    public List<PersonaDto> obtenerPersonas(PersonaDto dtoFiltro) throws DAOException {
        List<PersonaDto> lista = null;
        Map<String, Object> mapFiltro = new HashMap<String, Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            mapFiltro.put("id", dtoFiltro.getId());
        }
        if (dtoFiltro.getNombreCompleto() != null && dtoFiltro.getNombreCompleto().length() != 0) {
            mapFiltro.put("nombreCompleto", dtoFiltro.getNombreCompleto());
        }
        if (dtoFiltro.getTipoDocumentoDto().getId() != null && !dtoFiltro.getTipoDocumentoDto().getId().equals(0L) && !dtoFiltro.getTipoDocumentoDto().getId().equals(99L)) {
            mapFiltro.put("tipoDocumentoDto.id", dtoFiltro.getTipoDocumentoDto().getId());
        }
        if (dtoFiltro.getNumeroDocumento() != null && dtoFiltro.getNumeroDocumento().length() != 0) {
            mapFiltro.put("numeroDocumento", dtoFiltro.getNumeroDocumento());
        }
        if (dtoFiltro.getEmail() != null && dtoFiltro.getEmail().length() != 0) {
            mapFiltro.put("email", dtoFiltro.getEmail());
        }
        if (dtoFiltro.getTelefonoCelular() != null && dtoFiltro.getTelefonoCelular().length() != 0) {
            mapFiltro.put("telefonoCelular", dtoFiltro.getTelefonoCelular());
        }
        if (dtoFiltro.getTelefonoFijo() != null && dtoFiltro.getTelefonoFijo().length() != 0) {
            mapFiltro.put("telefonoFijo", dtoFiltro.getTelefonoFijo());
        }/*
         if (dtoFiltro.getNacionalidadDto().getId() != null && !dtoFiltro.getNacionalidadDto().getId().equals(0L) && !dtoFiltro.getNacionalidadDto().getId().equals(99L)) {
         mapFiltro.put("nacionalidadDto.id", dtoFiltro.getNacionalidadDto().getId());
         }*/
        if (dtoFiltro.getFechaNacimiento() != null) {
            mapFiltro.put("fechaNacimiento", dtoFiltro.getFechaNacimiento());
        }
        if (dtoFiltro.getEstadoCivilDto().getId() != null && !dtoFiltro.getEstadoCivilDto().getId().equals(0L) && !dtoFiltro.getEstadoCivilDto().getId().equals(99L)) {
            mapFiltro.put("estadoCivilDto.id", dtoFiltro.getEstadoCivilDto().getId());
        }

        Map<String, String> mapOrden = new HashMap<String, String>();
        mapOrden.put("fechaCreacion", "asc");

        try {
            lista = obtenerConFiltroConOrden(mapFiltro, mapOrden);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);

        }
        return lista;
    }

    public PersonaDto inicializar() {
        PersonaDto personaDto = new PersonaDto();
        //personaDto.setCatalogoParametroPadreDto(recursosManager.obtenerCatalogoParametroPorID(5L));
        //personaDto.setParametroPadreDto(recursosManager.obtenerParametroPorID(2L));
        return personaDto;
    }

    public String guardar(PersonaDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        UsuarioMBean usuarioMBean = (UsuarioMBean) WebServletContextListener.getApplicationContext().getBean("usuarioMBean");
        if (sessionMBean.getAccion() == ConstantesSgc.Formulario.NUEVO) {
            try {
                String nombreCompleto = dto.getPrimerNombre() + " "
                        + (dto.getSegundoNombre() == null ? "" : dto.getSegundoNombre()) + " "
                        + dto.getApellidoPaterno() + " "
                        + dto.getApellidoMaterno();
                //Creamos el usuario del Sistema
                UsuarioDto usuarioDto = new UsuarioDto();
                String contrasena = UtilCore.Seguridad.getCadenaAlfanumAleatoria(10);
                usuarioDto.setEstado(Boolean.TRUE);
                usuarioDto.setContrasenaActual(contrasena);
                usuarioDto.setLogin(dto.getEmail());
                usuarioDto.setRolDto(this.rolManager.obtenerPorId(ConstantesCore.ValoresDefecto.ID_ROL_SISTEMA_EMPLEADO));
                //usuarioDto.setRolDto(new RolDto(ConstantesCore.ValoresDefecto.ID_ROL_SISTEMA_EMPLEADO));
                usuarioDto.setEmailLaboral(dto.getEmail());
                usuarioDto.setDescripcion(nombreCompleto);
                usuarioMBean.guardar(usuarioDto);

                if (usuarioDto.getId() != null) {
                    dto.setUsuarioSistemaDto(usuarioDto);
                    dto.setUsuarioCreacion(sessionMBean.getSessionUsuarioDto().getId());
                    dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                    dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                    dto.setNombreCompleto(nombreCompleto);
                    UtilCore.General.toUpperCaseDto(dto);
                    nuevo(dto);
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                    to = "";
                }
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);

                to = null;
            }
        } else if (sessionMBean.getAccion() == ConstantesSgc.Formulario.EDITAR) {
            try {
                dto.getUsuarioSistemaDto().setLogin(dto.getEmail());
                dto.getUsuarioSistemaDto().setEmailLaboral(dto.getEmail());
                usuarioMBean.editarEmail(dto.getUsuarioSistemaDto());
                dto.setUsuario(sessionMBean.getSessionUsuarioDto().getId());
                dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setTerminal(sessionMBean.getSessionTerminal());
                dto.setNombreCompleto(dto.getPrimerNombre() + " "
                        + (dto.getSegundoNombre() == null ? "" : dto.getSegundoNombre()) + " "
                        + dto.getApellidoPaterno() + " "
                        + dto.getApellidoMaterno());
                UtilCore.General.toUpperCaseDto(dto);
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);

                to = "";
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);
                to = null;
            }
        }
        return to;
    }

    public PersonaDto obtenerPersonaPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(PersonaDto.class, id);
    }

    public PersonaDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(PersonaDto.class, id);
    }

    public List<PersonaDto> obtenerPersonaPorEmail(String email) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select p from PersonaDto as p where ";
        hqsql += " p.email = '" + email + "'";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PersonaDto> obtenerPersonaTipoYNroDocumento(Long tipoDocumento, String numeroDocumento) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select p from PersonaDto as p where ";
        hqsql += " p.tipoDocumentoDto.id = " + tipoDocumento;
        hqsql += " and p.numeroDocumento = " + numeroDocumento;
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PersonaDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(PersonaDto.class, filtros, orden);
    }

    public List<PersonaDto> obtenerPersonasAutocomplete(final String sqr) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.id=e.id ";

        hqsql += " and (e.puestoDto.estadoDto.id = ?)";
        listaParametros.add(ConstantesSgc.Parametro.PUESTO_ESTADO_HABILITADO);

        hqsql += " and ( upper(e.nombreCompleto) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.numeroDocumento) like '%" + sqr.toUpperCase() + "%' )";
        hqsql += " order by e.apellidoPaterno asc";
        //System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }
    
    public List<PersonaDto> obtenerEmpleadoAutocomplete(final String sqr) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from PersonaDto as e where e.epm=1 ";

        hqsql += " and (e.puestoDto.estadoDto.id = ?)";
        listaParametros.add(ConstantesSgc.Parametro.PUESTO_ESTADO_HABILITADO);

        hqsql += " and ( upper(e.nombreCompleto) like '%" + sqr.toUpperCase() + "%'";
        hqsql += " or upper(e.numeroDocumento) like '%" + sqr.toUpperCase() + "%' )";
        hqsql += " order by e.apellidoPaterno asc";
        //System.out.println(hqsql);
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }
}
